* SECTION:events
* @Short_description: Functions for handling events from the window system
* @Title: Events
- * @See_also: [Event Structures][gdk3-Event-Structures]
*
* This section describes functions dealing with events from the window
* system.
*
- * In GTK+ applications the events are handled automatically by toplevel
- * widgets and passed on to the appropriate widgets, so these functions are
- * rarely needed.
+ * In GTK applications the events are handled automatically by toplevel
+ * widgets and passed on to the event controllers of appropriate widgets,
+ * so these functions are rarely needed.
*/
/**
}
static void
-gdk_event_push_history (GdkEvent *event,
- GdkEvent *history_event)
+gdk_event_push_history (GdkEvent *event,
+ GdkEvent *history_event)
{
GdkTimeCoord *hist;
GdkDevice *device;
}
}
+/**
+ * gdk_event_ref:
+ * @event: a #GdkEvent
+ *
+ * Increase the ref count of @event.
+ *
+ * Returns: @event
+ */
GdkEvent *
gdk_event_ref (GdkEvent *event)
{
static void gdk_event_free (GdkEvent *event);
+/**
+ * gdk_event_unref:
+ * @event: a #GdkEvent
+ *
+ * Decrease the ref count of @event, and free it
+ * if the last reference is dropped.
+ */
void
gdk_event_unref (GdkEvent *event)
{
}
/**
- * gdk_event_get_surface:
+ * gdk_event_get_axis:
* @event: a #GdkEvent
+ * @axis_use: the axis use to look for
+ * @value: (out): location to store the value found
*
- * Extracts the #GdkSurface associated with an event.
+ * Extract the axis value for a particular axis use from
+ * an event structure.
*
- * Returns: (transfer none): The #GdkSurface associated with the event
- */
-GdkSurface *
-gdk_event_get_surface (GdkEvent *event)
+ * Returns: %TRUE if the specified axis was found, otherwise %FALSE
+ **/
+gboolean
+gdk_event_get_axis (GdkEvent *event,
+ GdkAxisUse axis_use,
+ double *value)
{
- g_return_val_if_fail (event != NULL, NULL);
+ double *axes;
- return event->any.surface;
-}
+ if (axis_use == GDK_AXIS_X || axis_use == GDK_AXIS_Y)
+ {
+ gdouble x, y;
-/**
- * gdk_event_get_time:
- * @event: a #GdkEvent
- *
- * Returns the time stamp from @event, if there is one; otherwise
- * returns #GDK_CURRENT_TIME. If @event is %NULL, returns #GDK_CURRENT_TIME.
- *
- * Returns: time stamp field from @event
- **/
-guint32
-gdk_event_get_time (GdkEvent *event)
-{
- if (event)
- switch (event->any.type)
- {
- case GDK_MOTION_NOTIFY:
- return event->motion.time;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- return event->button.time;
- case GDK_TOUCH_BEGIN:
- case GDK_TOUCH_UPDATE:
- case GDK_TOUCH_END:
- case GDK_TOUCH_CANCEL:
- return event->touch.time;
- case GDK_TOUCHPAD_SWIPE:
- return event->touchpad_swipe.time;
- case GDK_TOUCHPAD_PINCH:
- return event->touchpad_pinch.time;
- case GDK_SCROLL:
- return event->scroll.time;
- case GDK_KEY_PRESS:
- case GDK_KEY_RELEASE:
- return event->key.time;
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- return event->crossing.time;
- case GDK_PROXIMITY_IN:
- case GDK_PROXIMITY_OUT:
- return event->proximity.time;
- case GDK_DRAG_ENTER:
- case GDK_DRAG_LEAVE:
- case GDK_DRAG_MOTION:
- case GDK_DROP_START:
- return event->dnd.time;
- case GDK_PAD_BUTTON_PRESS:
- case GDK_PAD_BUTTON_RELEASE:
- return event->pad_button.time;
- case GDK_PAD_RING:
- case GDK_PAD_STRIP:
- return event->pad_axis.time;
- case GDK_PAD_GROUP_MODE:
- return event->pad_group_mode.time;
- case GDK_CONFIGURE:
- case GDK_FOCUS_CHANGE:
- case GDK_DELETE:
- case GDK_GRAB_BROKEN:
- case GDK_EVENT_LAST:
- default:
- /* return current time */
- break;
- }
-
- return GDK_CURRENT_TIME;
+ switch ((guint) event->any.type)
+ {
+ case GDK_MOTION_NOTIFY:
+ x = event->motion.x;
+ y = event->motion.y;
+ break;
+ case GDK_BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ x = event->button.x;
+ y = event->button.y;
+ break;
+ case GDK_TOUCH_BEGIN:
+ case GDK_TOUCH_UPDATE:
+ case GDK_TOUCH_END:
+ case GDK_TOUCH_CANCEL:
+ x = event->touch.x;
+ y = event->touch.y;
+ break;
+ case GDK_ENTER_NOTIFY:
+ case GDK_LEAVE_NOTIFY:
+ x = event->crossing.x;
+ y = event->crossing.y;
+ break;
+ default:
+ return FALSE;
+ }
+
+ if (axis_use == GDK_AXIS_X && value)
+ *value = x;
+ if (axis_use == GDK_AXIS_Y && value)
+ *value = y;
+
+ return TRUE;
+ }
+ else if (event->any.type == GDK_BUTTON_PRESS ||
+ event->any.type == GDK_BUTTON_RELEASE)
+ {
+ axes = event->button.axes;
+ }
+ else if (event->any.type == GDK_TOUCH_BEGIN ||
+ event->any.type == GDK_TOUCH_UPDATE ||
+ event->any.type == GDK_TOUCH_END ||
+ event->any.type == GDK_TOUCH_CANCEL)
+ {
+ axes = event->touch.axes;
+ }
+ else if (event->any.type == GDK_MOTION_NOTIFY)
+ {
+ axes = event->motion.axes;
+ }
+ else
+ return FALSE;
+
+ return gdk_device_get_axis (event->any.device, axes, axis_use, value);
}
/**
- * gdk_event_get_state:
- * @event: (allow-none): a #GdkEvent or %NULL
- * @state: (out): return location for state
+ * gdk_event_triggers_context_menu:
+ * @event: a #GdkEvent, currently only button events are meaningful values
*
- * If the event contains a “state” field, puts that field in @state.
+ * This function returns whether a #GdkEventButton should trigger a
+ * context menu, according to platform conventions. The right mouse
+ * button always triggers context menus. Additionally, if
+ * gdk_keymap_get_modifier_mask() returns a non-0 mask for
+ * %GDK_MODIFIER_INTENT_CONTEXT_MENU, then the left mouse button will
+ * also trigger a context menu if this modifier is pressed.
*
- * Otherwise stores an empty state (0).
- * @event may be %NULL, in which case it’s treated
- * as if the event had no state field.
+ * This function should always be used instead of simply checking for
+ * event->button == %GDK_BUTTON_SECONDARY.
*
- * Returns: %TRUE if there was a state field in the event
+ * Returns: %TRUE if the event should trigger a context menu.
**/
gboolean
-gdk_event_get_state (GdkEvent *event,
- GdkModifierType *state)
+gdk_event_triggers_context_menu (GdkEvent *event)
{
- g_return_val_if_fail (state != NULL, FALSE);
-
- if (event)
- switch (event->any.type)
- {
- case GDK_MOTION_NOTIFY:
- *state = event->motion.state;
- return TRUE;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- *state = event->button.state;
- return TRUE;
- case GDK_TOUCH_BEGIN:
- case GDK_TOUCH_UPDATE:
- case GDK_TOUCH_END:
- case GDK_TOUCH_CANCEL:
- *state = event->touch.state;
- return TRUE;
- case GDK_TOUCHPAD_SWIPE:
- *state = event->touchpad_swipe.state;
- return TRUE;
- case GDK_TOUCHPAD_PINCH:
- *state = event->touchpad_pinch.state;
- return TRUE;
- case GDK_SCROLL:
- *state = event->scroll.state;
- return TRUE;
- case GDK_KEY_PRESS:
- case GDK_KEY_RELEASE:
- *state = event->key.state;
+ g_return_val_if_fail (event != NULL, FALSE);
+
+ if (event->any.type == GDK_BUTTON_PRESS)
+ {
+ GdkEventButton *bevent = (GdkEventButton *) event;
+ GdkDisplay *display;
+ GdkModifierType modifier;
+
+ g_return_val_if_fail (GDK_IS_SURFACE (bevent->any.surface), FALSE);
+
+ if (bevent->button == GDK_BUTTON_SECONDARY &&
+ ! (bevent->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)))
return TRUE;
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- *state = event->crossing.state;
+
+ display = gdk_surface_get_display (bevent->any.surface);
+
+ modifier = gdk_keymap_get_modifier_mask (gdk_display_get_keymap (display),
+ GDK_MODIFIER_INTENT_CONTEXT_MENU);
+
+ if (modifier != 0 &&
+ bevent->button == GDK_BUTTON_PRIMARY &&
+ ! (bevent->state & (GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)) &&
+ (bevent->state & modifier))
return TRUE;
- case GDK_CONFIGURE:
- case GDK_FOCUS_CHANGE:
- case GDK_PROXIMITY_IN:
- case GDK_PROXIMITY_OUT:
- case GDK_DRAG_ENTER:
- case GDK_DRAG_LEAVE:
- case GDK_DRAG_MOTION:
- case GDK_DROP_START:
- case GDK_DELETE:
- case GDK_GRAB_BROKEN:
- case GDK_PAD_BUTTON_PRESS:
- case GDK_PAD_BUTTON_RELEASE:
- case GDK_PAD_RING:
- case GDK_PAD_STRIP:
- case GDK_PAD_GROUP_MODE:
- case GDK_EVENT_LAST:
- default:
- /* no state field */
- break;
- }
+ }
- *state = 0;
return FALSE;
}
-/**
- * gdk_event_get_coords:
- * @event: a #GdkEvent
- * @x_win: (out) (optional): location to put event surface x coordinate
- * @y_win: (out) (optional): location to put event surface y coordinate
- *
- * Extract the event surface relative x/y coordinates from an event.
- *
- * Returns: %TRUE if the event delivered event surface coordinates
- **/
-gboolean
-gdk_event_get_coords (GdkEvent *event,
- gdouble *x_win,
- gdouble *y_win)
+static gboolean
+gdk_events_get_axis_distances (GdkEvent *event1,
+ GdkEvent *event2,
+ gdouble *x_distance,
+ gdouble *y_distance,
+ gdouble *distance)
{
- gdouble x = 0, y = 0;
- gboolean fetched = TRUE;
+ gdouble x1, x2, y1, y2;
+ gdouble xd, yd;
- g_return_val_if_fail (event != NULL, FALSE);
+ if (!gdk_event_get_position (event1, &x1, &y1) ||
+ !gdk_event_get_position (event2, &x2, &y2))
+ return FALSE;
- switch ((guint) event->any.type)
- {
- case GDK_CONFIGURE:
- x = event->configure.x;
- y = event->configure.y;
- break;
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- x = event->crossing.x;
- y = event->crossing.y;
- break;
- case GDK_SCROLL:
- x = event->scroll.x;
- y = event->scroll.y;
- break;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- x = event->button.x;
- y = event->button.y;
- break;
- case GDK_TOUCH_BEGIN:
- case GDK_TOUCH_UPDATE:
- case GDK_TOUCH_END:
- case GDK_TOUCH_CANCEL:
- x = event->touch.x;
- y = event->touch.y;
- break;
- case GDK_MOTION_NOTIFY:
- x = event->motion.x;
- y = event->motion.y;
- break;
- case GDK_TOUCHPAD_SWIPE:
- x = event->touchpad_swipe.x;
- y = event->touchpad_swipe.y;
- break;
- case GDK_TOUCHPAD_PINCH:
- x = event->touchpad_pinch.x;
- y = event->touchpad_pinch.y;
- break;
- case GDK_DRAG_ENTER:
- case GDK_DRAG_LEAVE:
- case GDK_DRAG_MOTION:
- case GDK_DROP_START:
- x = event->dnd.x;
- y = event->dnd.y;
- break;
- default:
- fetched = FALSE;
- break;
- }
+ xd = x2 - x1;
+ yd = y2 - y1;
+
+ if (x_distance)
+ *x_distance = xd;
- if (x_win)
- *x_win = x;
- if (y_win)
- *y_win = y;
+ if (y_distance)
+ *y_distance = yd;
+
+ if (distance)
+ *distance = sqrt ((xd * xd) + (yd * yd));
- return fetched;
+ return TRUE;
}
/**
- * gdk_event_get_button:
- * @event: a #GdkEvent
- * @button: (out): location to store mouse button number
+ * gdk_events_get_distance:
+ * @event1: first #GdkEvent
+ * @event2: second #GdkEvent
+ * @distance: (out): return location for the distance
*
- * Extract the button number from an event.
+ * If both events have X/Y information, the distance between both coordinates
+ * (as in a straight line going from @event1 to @event2) will be returned.
*
- * Returns: %TRUE if the event delivered a button number
+ * Returns: %TRUE if the distance could be calculated.
**/
gboolean
-gdk_event_get_button (GdkEvent *event,
- guint *button)
+gdk_events_get_distance (GdkEvent *event1,
+ GdkEvent *event2,
+ gdouble *distance)
{
- gboolean fetched = TRUE;
- guint number = 0;
-
- g_return_val_if_fail (event != NULL, FALSE);
-
- switch ((guint) event->any.type)
- {
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- number = event->button.button;
- break;
- case GDK_PAD_BUTTON_PRESS:
- case GDK_PAD_BUTTON_RELEASE:
- number = event->pad_button.button;
- break;
- default:
- fetched = FALSE;
- break;
- }
-
- if (button)
- *button = number;
-
- return fetched;
+ return gdk_events_get_axis_distances (event1, event2,
+ NULL, NULL,
+ distance);
}
/**
- * gdk_event_get_click_count:
- * @event: a #GdkEvent
- * @click_count: (out): location to store click count
+ * gdk_events_get_angle:
+ * @event1: first #GdkEvent
+ * @event2: second #GdkEvent
+ * @angle: (out): return location for the relative angle between both events
*
- * Extracts the click count from an event.
+ * If both events contain X/Y information, this function will return %TRUE
+ * and return in @angle the relative angle from @event1 to @event2. The rotation
+ * direction for positive angles is from the positive X axis towards the positive
+ * Y axis.
*
- * Returns: %TRUE if the event delivered a click count
- */
+ * Returns: %TRUE if the angle could be calculated.
+ **/
gboolean
-gdk_event_get_click_count (GdkEvent *event,
- guint *click_count)
+gdk_events_get_angle (GdkEvent *event1,
+ GdkEvent *event2,
+ gdouble *angle)
{
- gboolean fetched = TRUE;
- guint number = 0;
+ gdouble x_distance, y_distance, distance;
- g_return_val_if_fail (event != NULL, FALSE);
+ if (!gdk_events_get_axis_distances (event1, event2,
+ &x_distance, &y_distance,
+ &distance))
+ return FALSE;
- switch ((guint) event->any.type)
+ if (angle)
{
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- number = 1;
- break;
- default:
- fetched = FALSE;
- break;
- }
+ *angle = atan2 (x_distance, y_distance);
- if (click_count)
- *click_count = number;
+ /* Invert angle */
+ *angle = (2 * G_PI) - *angle;
- return fetched;
-}
-
-/**
- * gdk_event_get_keyval:
- * @event: a #GdkEvent
- * @keyval: (out): location to store the keyval
- *
- * Extracts the keyval from an event.
- *
- * Returns: %TRUE if the event delivered a key symbol
- */
-gboolean
-gdk_event_get_keyval (GdkEvent *event,
- guint *keyval)
-{
- gboolean fetched = TRUE;
- guint number = 0;
-
- switch ((guint) event->any.type)
- {
- case GDK_KEY_PRESS:
- case GDK_KEY_RELEASE:
- number = event->key.keyval;
- break;
- default:
- fetched = FALSE;
- break;
- }
-
- if (keyval)
- *keyval = number;
-
- return fetched;
-}
-
-/**
- * gdk_event_get_keycode:
- * @event: a #GdkEvent
- * @keycode: (out): location to store the keycode
- *
- * Extracts the hardware keycode from an event.
- *
- * Also see gdk_event_get_scancode().
- *
- * Returns: %TRUE if the event delivered a hardware keycode
- */
-gboolean
-gdk_event_get_keycode (GdkEvent *event,
- guint16 *keycode)
-{
- gboolean fetched = TRUE;
- guint16 number = 0;
+ /* Shift it 90° */
+ *angle += G_PI / 2;
- switch ((guint) event->any.type)
- {
- case GDK_KEY_PRESS:
- case GDK_KEY_RELEASE:
- number = event->key.hardware_keycode;
- break;
- default:
- fetched = FALSE;
- break;
+ /* And constraint it to 0°-360° */
+ *angle = fmod (*angle, 2 * G_PI);
}
- if (keycode)
- *keycode = number;
-
- return fetched;
+ return TRUE;
}
/**
- * gdk_event_get_key_group:
- * @event: a #GdkEvent
- * @group: (out): return location for the key group
+ * gdk_events_get_center:
+ * @event1: first #GdkEvent
+ * @event2: second #GdkEvent
+ * @x: (out): return location for the X coordinate of the center
+ * @y: (out): return location for the Y coordinate of the center
*
- * Extracts the key group from an event.
+ * If both events contain X/Y information, the center of both coordinates
+ * will be returned in @x and @y.
*
- * Returns: %TRUE on success, otherwise %FALSE
+ * Returns: %TRUE if the center could be calculated.
**/
gboolean
-gdk_event_get_key_group (GdkEvent *event,
- guint *group)
+gdk_events_get_center (GdkEvent *event1,
+ GdkEvent *event2,
+ gdouble *x,
+ gdouble *y)
{
- gboolean fetched = TRUE;
-
- switch ((guint) event->any.type)
- {
- case GDK_KEY_PRESS:
- case GDK_KEY_RELEASE:
- *group = event->key.group;
- break;
- default:
- *group = 0;
- fetched = FALSE;
- break;
- }
+ gdouble x1, x2, y1, y2;
- return fetched;
-}
+ if (!gdk_event_get_position (event1, &x1, &y1) ||
+ !gdk_event_get_position (event2, &x2, &y2))
+ return FALSE;
-/**
- * gdk_event_get_key_is_modifier:
- * @event: a #GdkEvent
- * @is_modifier: (out): return location for the value
- *
- * Extracts whether the event is a key event for
- * a modifier key.
- *
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_key_is_modifier (GdkEvent *event,
- gboolean *is_modifier)
-{
- gboolean fetched = TRUE;
+ if (x)
+ *x = (x2 + x1) / 2;
- switch ((guint) event->any.type)
- {
- case GDK_KEY_PRESS:
- case GDK_KEY_RELEASE:
- *is_modifier = event->key.is_modifier;
- break;
- default:
- *is_modifier = FALSE;
- fetched = FALSE;
- break;
- }
+ if (y)
+ *y = (y2 + y1) / 2;
- return fetched;
+ return TRUE;
}
-/**
- * gdk_event_get_scroll_direction:
- * @event: a #GdkEvent
- * @direction: (out): location to store the scroll direction
- *
- * Extracts the scroll direction from an event.
- *
- * Returns: %TRUE if the event delivered a scroll direction
- */
-gboolean
-gdk_event_get_scroll_direction (GdkEvent *event,
- GdkScrollDirection *direction)
+static GdkEventSequence *
+gdk_event_sequence_copy (GdkEventSequence *sequence)
{
- gboolean fetched = TRUE;
- GdkScrollDirection dir = 0;
-
- switch ((guint) event->any.type)
- {
- case GDK_SCROLL:
- if (event->scroll.direction == GDK_SCROLL_SMOOTH)
- fetched = FALSE;
- else
- dir = event->scroll.direction;
- break;
- default:
- fetched = FALSE;
- break;
- }
-
- if (direction)
- *direction = dir;
-
- return fetched;
+ return sequence;
}
-/**
- * gdk_event_get_scroll_deltas:
- * @event: a #GdkEvent
- * @delta_x: (out): return location for X delta
- * @delta_y: (out): return location for Y delta
- *
- * Retrieves the scroll deltas from a #GdkEvent
- *
- * Returns: %TRUE if the event contains smooth scroll information
- **/
-gboolean
-gdk_event_get_scroll_deltas (GdkEvent *event,
- gdouble *delta_x,
- gdouble *delta_y)
+static void
+gdk_event_sequence_free (GdkEventSequence *sequence)
{
- gboolean fetched = TRUE;
- gdouble dx = 0.0;
- gdouble dy = 0.0;
-
- switch ((guint) event->any.type)
- {
- case GDK_SCROLL:
- if (event->scroll.direction == GDK_SCROLL_SMOOTH)
- {
- dx = event->scroll.delta_x;
- dy = event->scroll.delta_y;
- }
- else
- fetched = FALSE;
- break;
- default:
- fetched = FALSE;
- break;
- }
-
- if (delta_x)
- *delta_x = dx;
+ /* Nothing to free here */
+}
- if (delta_y)
- *delta_y = dy;
+G_DEFINE_BOXED_TYPE (GdkEventSequence, gdk_event_sequence,
+ gdk_event_sequence_copy,
+ gdk_event_sequence_free)
- return fetched;
-}
-/**
- * gdk_event_is_scroll_stop_event
- * @event: a #GdkEvent
- *
- * Check whether a scroll event is a stop scroll event. Scroll sequences
- * with smooth scroll information may provide a stop scroll event once the
- * interaction with the device finishes, e.g. by lifting a finger. This
- * stop scroll event is the signal that a widget may trigger kinetic
- * scrolling based on the current velocity.
- *
- * Stop scroll events always have a delta of 0/0.
- *
- * Returns: %TRUE if the event is a scroll stop event
- */
-gboolean
-gdk_event_is_scroll_stop_event (GdkEvent *event)
-{
- return event->scroll.is_stop;
-}
/**
- * gdk_event_get_axis:
+ * gdk_event_get_axes:
* @event: a #GdkEvent
- * @axis_use: the axis use to look for
- * @value: (out): location to store the value found
+ * @axes: (transfer none) (out) (array length=n_axes): the array of values for all axes
+ * @n_axes: (out): the length of array
*
- * Extract the axis value for a particular axis use from
- * an event structure.
+ * Extracts all axis values from an event.
*
- * Returns: %TRUE if the specified axis was found, otherwise %FALSE
+ * Returns: %TRUE on success, otherwise %FALSE
**/
gboolean
-gdk_event_get_axis (GdkEvent *event,
- GdkAxisUse axis_use,
- gdouble *value)
+gdk_event_get_axes (GdkEvent *event,
+ double **axes,
+ guint *n_axes)
{
- gdouble *axes;
-
- g_return_val_if_fail (event != NULL, FALSE);
+ GdkDevice *source_device;
- if (axis_use == GDK_AXIS_X || axis_use == GDK_AXIS_Y)
- {
- gdouble x, y;
+ if (!event)
+ return FALSE;
- switch ((guint) event->any.type)
- {
- case GDK_MOTION_NOTIFY:
- x = event->motion.x;
- y = event->motion.y;
- break;
- case GDK_SCROLL:
- x = event->scroll.x;
- y = event->scroll.y;
- break;
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- x = event->button.x;
- y = event->button.y;
- break;
- case GDK_TOUCH_BEGIN:
- case GDK_TOUCH_UPDATE:
- case GDK_TOUCH_END:
- case GDK_TOUCH_CANCEL:
- x = event->touch.x;
- y = event->touch.y;
- break;
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- x = event->crossing.x;
- y = event->crossing.y;
- break;
- default:
- return FALSE;
- }
+ source_device = gdk_event_get_source_device (event);
- if (axis_use == GDK_AXIS_X && value)
- *value = x;
- if (axis_use == GDK_AXIS_Y && value)
- *value = y;
+ if (!source_device)
+ return FALSE;
+ if (event->any.type == GDK_MOTION_NOTIFY)
+ {
+ *axes = event->motion.axes;
+ *n_axes = gdk_device_get_n_axes (source_device);
return TRUE;
}
else if (event->any.type == GDK_BUTTON_PRESS ||
- event->any.type == GDK_BUTTON_RELEASE)
+ event->any.type == GDK_BUTTON_RELEASE)
{
- axes = event->button.axes;
+ *axes = event->button.axes;
+ *n_axes = gdk_device_get_n_axes (source_device);
+ return TRUE;
}
else if (event->any.type == GDK_TOUCH_BEGIN ||
event->any.type == GDK_TOUCH_UPDATE ||
event->any.type == GDK_TOUCH_END ||
event->any.type == GDK_TOUCH_CANCEL)
{
- axes = event->touch.axes;
- }
- else if (event->any.type == GDK_MOTION_NOTIFY)
- {
- axes = event->motion.axes;
+ *axes = event->touch.axes;
+ *n_axes = gdk_device_get_n_axes (source_device);
+ return TRUE;
}
- else
- return FALSE;
- return gdk_device_get_axis (event->any.device, axes, axis_use, value);
+ return FALSE;
}
/**
- * gdk_event_get_device:
- * @event: a #GdkEvent.
+ * gdk_event_get_motion_history:
+ * @event: a #GdkEvent of type %GDK_MOTION_NOTIFY
*
- * If the event contains a “device” field, this function will return
- * it, else it will return %NULL.
+ * Retrieves the history of the @event motion, as a list of time and
+ * coordinates.
*
- * Returns: (nullable) (transfer none): a #GdkDevice, or %NULL.
- **/
-GdkDevice *
-gdk_event_get_device (GdkEvent *event)
+ * Returns: (transfer container) (element-type GdkTimeCoord) (nullable): a list
+ * of time and coordinates
+ */
+GList *
+gdk_event_get_motion_history (GdkEvent *event)
{
- g_return_val_if_fail (event != NULL, NULL);
-
- return event->any.device;
+ if (event->any.type != GDK_MOTION_NOTIFY)
+ return NULL;
+ return g_list_reverse (g_list_copy (event->motion.history));
}
-/**
- * gdk_event_get_source_device:
- * @event: a #GdkEvent
- *
- * This function returns the hardware (slave) #GdkDevice that has
- * triggered the event, falling back to the virtual (master) device
- * (as in gdk_event_get_device()) if the event wasn’t caused by
- * interaction with a hardware device. This may happen for example
- * in synthesized crossing events after a #GdkSurface updates its
- * geometry or a grab is acquired/released.
- *
- * If the event does not contain a device field, this function will
- * return %NULL.
- *
- * Returns: (nullable) (transfer none): a #GdkDevice, or %NULL.
- **/
-GdkDevice *
-gdk_event_get_source_device (GdkEvent *event)
+GdkEvent *
+gdk_event_button_new (GdkEventType type,
+ GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ GdkDeviceTool *tool,
+ guint32 time,
+ GdkModifierType state,
+ guint button,
+ double x,
+ double y,
+ double *axes)
{
- g_return_val_if_fail (event != NULL, NULL);
+ GdkEventButton *event;
- if (event->any.source_device)
- return event->any.source_device;
+ g_return_val_if_fail (type == GDK_BUTTON_PRESS ||
+ type == GDK_BUTTON_RELEASE, NULL);
+
+ event = g_new0 (GdkEventButton, 1);
+ event->any.ref_count = 1;
+ event->any.type = type;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->tool = tool ? g_object_ref (tool) : NULL;
+ event->time = time;
+ event->axes = NULL;
+ event->state = state;
+ event->button = button;
+ event->x = x;
+ event->y = y;
+ event->axes = axes;
- /* Fallback to event device */
- return gdk_event_get_device (event);
+ return (GdkEvent *)event;
}
-/**
- * gdk_event_triggers_context_menu:
- * @event: a #GdkEvent, currently only button events are meaningful values
- *
- * This function returns whether a #GdkEventButton should trigger a
- * context menu, according to platform conventions. The right mouse
- * button always triggers context menus. Additionally, if
- * gdk_keymap_get_modifier_mask() returns a non-0 mask for
- * %GDK_MODIFIER_INTENT_CONTEXT_MENU, then the left mouse button will
- * also trigger a context menu if this modifier is pressed.
- *
- * This function should always be used instead of simply checking for
- * event->button == %GDK_BUTTON_SECONDARY.
- *
- * Returns: %TRUE if the event should trigger a context menu.
- **/
-gboolean
-gdk_event_triggers_context_menu (GdkEvent *event)
+GdkEvent *
+gdk_event_motion_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ GdkDeviceTool *tool,
+ guint32 time,
+ GdkModifierType state,
+ double x,
+ double y,
+ double *axes)
{
- g_return_val_if_fail (event != NULL, FALSE);
+ GdkEventMotion *event = g_new0 (GdkEventMotion, 1);
- if (event->any.type == GDK_BUTTON_PRESS)
- {
- GdkEventButton *bevent = (GdkEventButton *) event;
- GdkDisplay *display;
- GdkModifierType modifier;
+ event->any.ref_count = 1;
+ event->any.type = GDK_MOTION_NOTIFY;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->tool = tool ? g_object_ref (tool) : NULL;
+ event->time = time;
+ event->state = state;
+ event->x = x;
+ event->y = y;
+ event->axes = axes;
+ event->state = state;
- g_return_val_if_fail (GDK_IS_SURFACE (bevent->any.surface), FALSE);
+ return (GdkEvent *)event;
+}
- if (bevent->button == GDK_BUTTON_SECONDARY &&
- ! (bevent->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)))
- return TRUE;
+GdkEvent *
+gdk_event_crossing_new (GdkEventType type,
+ GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ guint32 time,
+ GdkModifierType state,
+ double x,
+ double y,
+ GdkCrossingMode mode,
+ GdkNotifyType detail)
+{
+ GdkEventCrossing *event;
- display = gdk_surface_get_display (bevent->any.surface);
+ g_return_val_if_fail (type == GDK_ENTER_NOTIFY ||
+ type == GDK_LEAVE_NOTIFY, NULL);
- modifier = gdk_keymap_get_modifier_mask (gdk_display_get_keymap (display),
- GDK_MODIFIER_INTENT_CONTEXT_MENU);
+ event = g_new0 (GdkEventCrossing, 1);
- if (modifier != 0 &&
- bevent->button == GDK_BUTTON_PRIMARY &&
- ! (bevent->state & (GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)) &&
- (bevent->state & modifier))
- return TRUE;
- }
+ event->any.ref_count = 1;
+ event->any.type = type;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->time = time;
+ event->state = state;
+ event->x = x;
+ event->y = y;
+ event->mode = mode;
+ event->detail = detail;
- return FALSE;
+ return (GdkEvent *)event;
}
-static gboolean
-gdk_events_get_axis_distances (GdkEvent *event1,
- GdkEvent *event2,
- gdouble *x_distance,
- gdouble *y_distance,
- gdouble *distance)
+GdkEvent *
+gdk_event_proximity_new (GdkEventType type,
+ GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ GdkDeviceTool *tool,
+ guint32 time)
{
- gdouble x1, x2, y1, y2;
- gdouble xd, yd;
+ GdkEventProximity *event;
- if (!gdk_event_get_coords (event1, &x1, &y1) ||
- !gdk_event_get_coords (event2, &x2, &y2))
- return FALSE;
+ g_return_val_if_fail (type == GDK_PROXIMITY_IN ||
+ type == GDK_PROXIMITY_OUT, NULL);
- xd = x2 - x1;
- yd = y2 - y1;
+ event = g_new0 (GdkEventProximity, 1);
- if (x_distance)
- *x_distance = xd;
+ event->any.ref_count = 1;
+ event->any.type = type;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->tool = tool ? g_object_ref (tool) : NULL;
+ event->time = time;
- if (y_distance)
- *y_distance = yd;
+ return (GdkEvent *)event;
+}
- if (distance)
- *distance = sqrt ((xd * xd) + (yd * yd));
+GdkEvent *
+gdk_event_key_new (GdkEventType type,
+ GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ guint32 time,
+ GdkModifierType state,
+ guint keyval,
+ guint16 keycode,
+ guint16 scancode,
+ guint8 group,
+ gboolean is_modifier)
+{
+ GdkEventKey *event;
- return TRUE;
+ g_return_val_if_fail (type == GDK_KEY_PRESS ||
+ type == GDK_KEY_RELEASE, NULL);
+
+ event = g_new0 (GdkEventKey, 1);
+
+ event->any.ref_count = 1;
+ event->any.type = type;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->time = time;
+ event->state = state;
+ event->keyval = keyval;
+ event->hardware_keycode = keycode;
+ event->key_scancode = scancode;
+ event->group = group;
+ event->is_modifier = is_modifier;
+
+ return (GdkEvent *)event;
}
-/**
- * gdk_events_get_distance:
- * @event1: first #GdkEvent
- * @event2: second #GdkEvent
- * @distance: (out): return location for the distance
- *
- * If both events have X/Y information, the distance between both coordinates
- * (as in a straight line going from @event1 to @event2) will be returned.
- *
- * Returns: %TRUE if the distance could be calculated.
- **/
-gboolean
-gdk_events_get_distance (GdkEvent *event1,
- GdkEvent *event2,
- gdouble *distance)
+GdkEvent *
+gdk_event_configure_new (GdkSurface *surface,
+ int width,
+ int height)
{
- return gdk_events_get_axis_distances (event1, event2,
- NULL, NULL,
- distance);
+ GdkEventConfigure *event = g_new0 (GdkEventConfigure, 1);
+
+ event->any.ref_count = 1;
+ event->any.type = GDK_CONFIGURE;
+ event->any.surface = g_object_ref (surface);
+ event->width = width;
+ event->height = height;
+
+ return (GdkEvent *)event;
}
-/**
- * gdk_events_get_angle:
- * @event1: first #GdkEvent
- * @event2: second #GdkEvent
- * @angle: (out): return location for the relative angle between both events
- *
- * If both events contain X/Y information, this function will return %TRUE
- * and return in @angle the relative angle from @event1 to @event2. The rotation
- * direction for positive angles is from the positive X axis towards the positive
- * Y axis.
- *
- * Returns: %TRUE if the angle could be calculated.
- **/
-gboolean
-gdk_events_get_angle (GdkEvent *event1,
- GdkEvent *event2,
- gdouble *angle)
+GdkEvent *
+gdk_event_delete_new (GdkSurface *surface)
{
- gdouble x_distance, y_distance, distance;
+ GdkEventAny *event = g_new0 (GdkEventAny, 1);
- if (!gdk_events_get_axis_distances (event1, event2,
- &x_distance, &y_distance,
- &distance))
- return FALSE;
-
- if (angle)
- {
- *angle = atan2 (x_distance, y_distance);
-
- /* Invert angle */
- *angle = (2 * G_PI) - *angle;
-
- /* Shift it 90° */
- *angle += G_PI / 2;
-
- /* And constraint it to 0°-360° */
- *angle = fmod (*angle, 2 * G_PI);
- }
+ event->ref_count = 1;
+ event->type = GDK_DELETE;
+ event->surface = g_object_ref (surface);
- return TRUE;
+ return (GdkEvent *)event;
}
-/**
- * gdk_events_get_center:
- * @event1: first #GdkEvent
- * @event2: second #GdkEvent
- * @x: (out): return location for the X coordinate of the center
- * @y: (out): return location for the Y coordinate of the center
- *
- * If both events contain X/Y information, the center of both coordinates
- * will be returned in @x and @y.
- *
- * Returns: %TRUE if the center could be calculated.
- **/
-gboolean
-gdk_events_get_center (GdkEvent *event1,
- GdkEvent *event2,
- gdouble *x,
- gdouble *y)
+GdkEvent *
+gdk_event_focus_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ gboolean focus_in)
{
- gdouble x1, x2, y1, y2;
-
- if (!gdk_event_get_coords (event1, &x1, &y1) ||
- !gdk_event_get_coords (event2, &x2, &y2))
- return FALSE;
-
- if (x)
- *x = (x2 + x1) / 2;
+ GdkEventFocus *event = g_new0 (GdkEventFocus, 1);
- if (y)
- *y = (y2 + y1) / 2;
+ event->any.ref_count = 1;
+ event->any.type = GDK_FOCUS_CHANGE;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->in = focus_in;
- return TRUE;
+ return (GdkEvent *)event;
}
-/**
- * gdk_event_get_display:
- * @event: a #GdkEvent
- *
- * Retrieves the #GdkDisplay associated to the @event.
- *
- * Returns: (transfer none) (nullable): a #GdkDisplay
- */
-GdkDisplay *
-gdk_event_get_display (GdkEvent *event)
+GdkEvent *
+gdk_event_scroll_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ GdkDeviceTool *tool,
+ guint32 time,
+ GdkModifierType state,
+ double delta_x,
+ double delta_y,
+ gboolean is_stop)
{
- if (event->any.display)
- return event->any.display;
+ GdkEventScroll *event = g_new0 (GdkEventScroll, 1);
- if (event->any.surface)
- return gdk_surface_get_display (event->any.surface);
+ event->any.ref_count = 1;
+ event->any.type = GDK_SCROLL;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->tool = tool ? g_object_ref (tool) : NULL;
+ event->time = time;
+ event->state = state;
+ event->x = NAN;
+ event->y = NAN;
+ event->direction = GDK_SCROLL_SMOOTH;
+ event->delta_x = delta_x;
+ event->delta_y = delta_y;
+ event->is_stop = is_stop;
- return NULL;
+ return (GdkEvent *)event;
}
-/**
- * gdk_event_get_event_sequence:
- * @event: a #GdkEvent
- *
- * If @event if of type %GDK_TOUCH_BEGIN, %GDK_TOUCH_UPDATE,
- * %GDK_TOUCH_END or %GDK_TOUCH_CANCEL, returns the #GdkEventSequence
- * to which the event belongs. Otherwise, return %NULL.
- *
- * Returns: (transfer none): the event sequence that the event belongs to
- */
-GdkEventSequence *
-gdk_event_get_event_sequence (GdkEvent *event)
+GdkEvent *
+gdk_event_discrete_scroll_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ GdkDeviceTool *tool,
+ guint32 time,
+ GdkModifierType state,
+ GdkScrollDirection direction,
+ gboolean emulated)
{
- if (!event)
- return NULL;
+ GdkEventScroll *event = g_new0 (GdkEventScroll, 1);
- if (event->any.type == GDK_TOUCH_BEGIN ||
- event->any.type == GDK_TOUCH_UPDATE ||
- event->any.type == GDK_TOUCH_END ||
- event->any.type == GDK_TOUCH_CANCEL)
- return event->touch.sequence;
+ event->any.ref_count = 1;
+ event->any.type = GDK_SCROLL;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->tool = tool ? g_object_ref (tool) : NULL;
+ event->time = time;
+ event->state = state;
+ event->x = NAN;
+ event->y = NAN;
+ event->direction = direction;
+ if (emulated)
+ event->any.flags = GDK_EVENT_POINTER_EMULATED;
- return NULL;
+ return (GdkEvent *)event;
}
-static GdkEventSequence *
-gdk_event_sequence_copy (GdkEventSequence *sequence)
+GdkEvent *
+gdk_event_touch_new (GdkEventType type,
+ GdkEventSequence *sequence,
+ GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ guint32 time,
+ GdkModifierType state,
+ double x,
+ double y,
+ double *axes,
+ gboolean emulating)
{
- return sequence;
-}
+ GdkEventTouch *event;
-static void
-gdk_event_sequence_free (GdkEventSequence *sequence)
-{
- /* Nothing to free here */
-}
+ g_return_val_if_fail (type == GDK_TOUCH_BEGIN ||
+ type == GDK_TOUCH_END ||
+ type == GDK_TOUCH_UPDATE ||
+ type == GDK_TOUCH_CANCEL, NULL);
-G_DEFINE_BOXED_TYPE (GdkEventSequence, gdk_event_sequence,
- gdk_event_sequence_copy,
- gdk_event_sequence_free)
+ event = g_new0 (GdkEventTouch, 1);
-/**
- * gdk_event_get_event_type:
- * @event: a #GdkEvent
- *
- * Retrieves the type of the event.
- *
- * Returns: a #GdkEventType
- */
-GdkEventType
-gdk_event_get_event_type (GdkEvent *event)
-{
- g_return_val_if_fail (event != NULL, 0);
+ event->any.ref_count = 1;
+ event->any.type = type;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->sequence = sequence;
+ event->time = time;
+ event->state = state;
+ event->x = x;
+ event->y = y;
+ event->axes = axes;
+ event->emulating_pointer = emulating;
+ if (emulating)
+ event->any.flags = GDK_EVENT_POINTER_EMULATED;
- return event->any.type;
+ return (GdkEvent *)event;
}
-/**
- * gdk_event_get_seat:
- * @event: a #GdkEvent
- *
- * Returns the #GdkSeat this event was generated for.
- *
- * Returns: (transfer none): The #GdkSeat of this event
- **/
-GdkSeat *
-gdk_event_get_seat (GdkEvent *event)
+GdkEvent *
+gdk_event_touchpad_swipe_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ guint32 time,
+ GdkModifierType state,
+ GdkTouchpadGesturePhase phase,
+ double x,
+ double y,
+ int n_fingers,
+ double dx,
+ double dy)
{
- GdkDevice *device;
+ GdkEventTouchpadSwipe *event = g_new0 (GdkEventTouchpadSwipe, 1);
- device = gdk_event_get_device (event);
+ event->any.ref_count = 1;
+ event->any.type = GDK_TOUCHPAD_SWIPE;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->time = time;
+ event->state = state;
+ event->phase = phase;
+ event->x = x;
+ event->y = y;
+ event->dx = dx;
+ event->dy = dy;
+ event->n_fingers = n_fingers;
- return device ? gdk_device_get_seat (device) : NULL;
+ return (GdkEvent *)event;
}
-/**
- * gdk_event_get_device_tool:
- * @event: a #GdkEvent
- *
- * If the event was generated by a device that supports
- * different tools (eg. a tablet), this function will
- * return a #GdkDeviceTool representing the tool that
- * caused the event. Otherwise, %NULL will be returned.
- *
- * Note: the #GdkDeviceTool<!-- -->s will be constant during
- * the application lifetime, if settings must be stored
- * persistently across runs, see gdk_device_tool_get_serial()
- *
- * Returns: (transfer none): The current device tool, or %NULL
- **/
-GdkDeviceTool *
-gdk_event_get_device_tool (GdkEvent *event)
-{
- if (event->any.type == GDK_BUTTON_PRESS ||
- event->any.type == GDK_BUTTON_RELEASE)
- return event->button.tool;
- else if (event->any.type == GDK_MOTION_NOTIFY)
- return event->motion.tool;
- else if (event->any.type == GDK_PROXIMITY_IN ||
- event->any.type == GDK_PROXIMITY_OUT)
- return event->proximity.tool;
- else if (event->any.type == GDK_SCROLL)
- return event->scroll.tool;
-
- return NULL;
+GdkEvent *
+gdk_event_touchpad_pinch_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ guint32 time,
+ GdkModifierType state,
+ GdkTouchpadGesturePhase phase,
+ double x,
+ double y,
+ int n_fingers,
+ double dx,
+ double dy,
+ double scale,
+ double angle_delta)
+{
+ GdkEventTouchpadPinch *event = g_new0 (GdkEventTouchpadPinch, 1);
+
+ event->any.ref_count = 1;
+ event->any.type = GDK_TOUCHPAD_PINCH;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->time = time;
+ event->state = state;
+ event->phase = phase;
+ event->x = x;
+ event->y = y;
+ event->dx = dx;
+ event->dy = dy;
+ event->n_fingers = n_fingers;
+ event->scale = scale;
+ event->angle_delta = angle_delta;
+
+ return (GdkEvent *)event;
+}
+
+GdkEvent *
+gdk_event_pad_ring_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ guint32 time,
+ guint group,
+ guint index,
+ guint mode,
+ double value)
+{
+ GdkEventPadAxis *event = g_new0 (GdkEventPadAxis, 1);
+
+ event->any.ref_count = 1;
+ event->any.type = GDK_PAD_RING;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->time = time;
+ event->group = group;
+ event->index = index;
+ event->mode = mode;
+ event->value = value;
+
+ return (GdkEvent *)event;
+}
+
+GdkEvent *
+gdk_event_pad_strip_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ guint32 time,
+ guint group,
+ guint index,
+ guint mode,
+ double value)
+{
+ GdkEventPadAxis *event = g_new0 (GdkEventPadAxis, 1);
+
+ event->any.ref_count = 1;
+ event->any.type = GDK_PAD_STRIP;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->time = time;
+ event->group = group;
+ event->index = index;
+ event->mode = mode;
+ event->value = value;
+
+ return (GdkEvent *)event;
+}
+
+GdkEvent *
+gdk_event_pad_button_new (GdkEventType type,
+ GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ guint32 time,
+ guint group,
+ guint button,
+ guint mode)
+{
+ GdkEventPadButton *event;
+
+ g_return_val_if_fail (type == GDK_PAD_BUTTON_PRESS ||
+ type == GDK_PAD_BUTTON_RELEASE, NULL);
+
+ event = g_new0 (GdkEventPadButton, 1);
+
+ event->any.ref_count = 1;
+ event->any.type = type;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->time = time;
+ event->group = group;
+ event->button = button;
+ event->mode = mode;
+
+ return (GdkEvent *)event;
+}
+
+GdkEvent *
+gdk_event_pad_group_mode_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ guint32 time,
+ guint group,
+ guint mode)
+{
+ GdkEventPadGroupMode *event = g_new0 (GdkEventPadGroupMode, 1);
+
+ event->any.ref_count = 1;
+ event->any.type = GDK_PAD_GROUP_MODE;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->time = time;
+ event->group = group;
+ event->mode = mode;
+
+ return (GdkEvent *)event;
+}
+
+GdkEvent *
+gdk_event_drag_new (GdkEventType type,
+ GdkSurface *surface,
+ GdkDevice *device,
+ GdkDrop *drop,
+ guint32 time,
+ double x,
+ double y)
+{
+ GdkEventDND *event;
+
+ g_return_val_if_fail (type == GDK_DRAG_ENTER ||
+ type == GDK_DRAG_MOTION ||
+ type == GDK_DRAG_LEAVE ||
+ type == GDK_DROP_START, NULL);
+
+ event = g_new0 (GdkEventDND, 1);
+
+ event->any.ref_count = 1;
+ event->any.type = type;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->drop = g_object_ref (drop);
+ event->time = time;
+ event->x = x;
+ event->y = y;
+
+ return (GdkEvent *)event;
+}
+
+GdkEvent *
+gdk_event_grab_broken_new (GdkSurface *surface,
+ GdkDevice *device,
+ GdkDevice *source_device,
+ GdkSurface *grab_surface,
+ gboolean implicit)
+{
+ GdkEventGrabBroken *event = g_new0 (GdkEventGrabBroken, 1);
+
+ event->any.ref_count = 1;
+ event->any.type = GDK_GRAB_BROKEN;
+ event->any.surface = g_object_ref (surface);
+ event->any.device = g_object_ref (device);
+ event->any.source_device = g_object_ref (source_device);
+ event->grab_surface = grab_surface;
+ event->implicit = implicit;
+ event->keyboard = gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD;
+
+ return (GdkEvent *)event;
}
/**
- * gdk_event_get_scancode:
+ * gdk_event_get_event_type:
* @event: a #GdkEvent
*
- * Gets the keyboard low-level scancode of a key event.
- *
- * This is usually hardware_keycode. On Windows this is the high
- * word of WM_KEY{DOWN,UP} lParam which contains the scancode and
- * some extended flags.
+ * Retrieves the type of the event.
*
- * Returns: The associated keyboard scancode or 0
- **/
-int
-gdk_event_get_scancode (GdkEvent *event)
+ * Returns: a #GdkEventType
+ */
+GdkEventType
+gdk_event_get_event_type (GdkEvent *event)
{
- if (event->any.type == GDK_KEY_PRESS ||
- event->any.type == GDK_KEY_RELEASE)
- return event->key.key_scancode;
-
- return 0;
+ return event->any.type;
}
/**
- * gdk_event_is_sent:
+ * gdk_event_get_surface:
* @event: a #GdkEvent
*
- * Returns whether the event was sent explicitly.
+ * Extracts the #GdkSurface associated with an event.
*
- * Returns: %TRUE if the event was sent explicitly
+ * Returns: (transfer none): The #GdkSurface associated with the event
*/
-gboolean
-gdk_event_is_sent (GdkEvent *event)
+GdkSurface *
+gdk_event_get_surface (GdkEvent *event)
{
- if (!event)
- return FALSE;
-
- return event->any.send_event;
+ return event->any.surface;
}
/**
- * gdk_event_get_drop:
- * @event: a #GdkEvent
+ * gdk_event_get_device:
+ * @event: a #GdkEvent.
*
- * Gets the #GdkDrop from a DND event.
+ * Returns the device of an event.
*
- * Returns: (transfer none) (nullable): the drop
+ * Returns: (nullable) (transfer none): a #GdkDevice, or %NULL.
**/
-GdkDrop *
-gdk_event_get_drop (GdkEvent *event)
+GdkDevice *
+gdk_event_get_device (GdkEvent *event)
{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_DRAG_ENTER ||
- event->any.type == GDK_DRAG_LEAVE ||
- event->any.type == GDK_DRAG_MOTION ||
- event->any.type == GDK_DROP_START)
- {
- return event->dnd.drop;
- }
-
- return NULL;
+ return event->any.device;
}
/**
- * gdk_event_get_crossing_mode:
+ * gdk_event_get_source_device:
* @event: a #GdkEvent
- * @mode: (out): return location for the crossing mode
*
- * Extracts the crossing mode from an event.
+ * This function returns the hardware (slave) #GdkDevice that has
+ * triggered the event, falling back to the virtual (master) device
+ * (as in gdk_event_get_device()) if the event wasn’t caused by
+ * interaction with a hardware device. This may happen for example
+ * in synthesized crossing events after a #GdkSurface updates its
+ * geometry or a grab is acquired/released.
*
- * Returns: %TRUE on success, otherwise %FALSE
+ * If the event does not contain a device field, this function will
+ * return %NULL.
+ *
+ * Returns: (nullable) (transfer none): a #GdkDevice, or %NULL.
**/
-gboolean
-gdk_event_get_crossing_mode (GdkEvent *event,
- GdkCrossingMode *mode)
+GdkDevice *
+gdk_event_get_source_device (GdkEvent *event)
{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_ENTER_NOTIFY ||
- event->any.type == GDK_LEAVE_NOTIFY)
- {
- *mode = event->crossing.mode;
- return TRUE;
- }
- else if (event->any.type == GDK_FOCUS_CHANGE)
- {
- *mode = event->focus_change.mode;
- return TRUE;
- }
+ if (event->any.source_device)
+ return event->any.source_device;
- return FALSE;
+ return event->any.device;
}
/**
- * gdk_event_get_crossing_detail:
+ * gdk_event_get_device_tool:
* @event: a #GdkEvent
- * @detail: (out): return location for the crossing detail
*
- * Extracts the crossing detail from an event.
+ * If the event was generated by a device that supports
+ * different tools (eg. a tablet), this function will
+ * return a #GdkDeviceTool representing the tool that
+ * caused the event. Otherwise, %NULL will be returned.
*
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_crossing_detail (GdkEvent *event,
- GdkNotifyType *detail)
-{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_ENTER_NOTIFY ||
- event->any.type == GDK_LEAVE_NOTIFY)
- {
- *detail = event->crossing.detail;
- return TRUE;
- }
- else if (event->any.type == GDK_FOCUS_CHANGE)
- {
- *detail = event->focus_change.detail;
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * gdk_event_get_touchpad_gesture_phase:
- * @event: a #GdkEvent
- * @phase: (out): Return location for the gesture phase
- *
- * Extracts the touchpad gesture phase from a touchpad event.
- *
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_touchpad_gesture_phase (GdkEvent *event,
- GdkTouchpadGesturePhase *phase)
-{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_TOUCHPAD_PINCH)
- {
- *phase = event->touchpad_pinch.phase;
- return TRUE;
- }
- else if (event->any.type == GDK_TOUCHPAD_SWIPE)
- {
- *phase = event->touchpad_swipe.phase;
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * gdk_event_get_touchpad_gesture_n_fingers:
- * @event: a #GdkEvent
- * @n_fingers: (out): return location for the number of fingers
- *
- * Extracts the number of fingers from a touchpad event.
- *
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_touchpad_gesture_n_fingers (GdkEvent *event,
- guint *n_fingers)
-{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_TOUCHPAD_PINCH)
- {
- *n_fingers = event->touchpad_pinch.n_fingers;
- return TRUE;
- }
- else if (event->any.type == GDK_TOUCHPAD_SWIPE)
- {
- *n_fingers = event->touchpad_swipe.n_fingers;
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * gdk_event_get_touchpad_deltas:
- * @event: a #GdkEvent
- * @dx: (out): return location for x
- * @dy: (out): return location for y
- *
- * Extracts delta information from a touchpad event.
+ * Note: the #GdkDeviceTools will be constant during
+ * the application lifetime, if settings must be stored
+ * persistently across runs, see gdk_device_tool_get_serial()
*
- * Returns: %TRUE on success, otherwise %FALSE
+ * Returns: (transfer none): The current device tool, or %NULL
**/
-gboolean
-gdk_event_get_touchpad_deltas (GdkEvent *event,
- double *dx,
- double *dy)
+GdkDeviceTool *
+gdk_event_get_device_tool (GdkEvent *event)
{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_TOUCHPAD_PINCH)
- {
- *dx = event->touchpad_pinch.dx;
- *dy = event->touchpad_pinch.dy;
- return TRUE;
- }
- else if (event->any.type == GDK_TOUCHPAD_SWIPE)
- {
- *dx = event->touchpad_swipe.dx;
- *dy = event->touchpad_swipe.dy;
- return TRUE;
- }
+ if (event->any.type == GDK_BUTTON_PRESS ||
+ event->any.type == GDK_BUTTON_RELEASE)
+ return event->button.tool;
+ else if (event->any.type == GDK_MOTION_NOTIFY)
+ return event->motion.tool;
+ else if (event->any.type == GDK_PROXIMITY_IN ||
+ event->any.type == GDK_PROXIMITY_OUT)
+ return event->proximity.tool;
+ else if (event->any.type == GDK_SCROLL)
+ return event->scroll.tool;
- return FALSE;
+ return NULL;
}
/**
- * gdk_event_get_touchpad_angle_delta:
+ * gdk_event_get_time:
* @event: a #GdkEvent
- * @delta: (out): Return location for angle
- *
- * Extracts the angle from a touchpad event.
- *
- * Returns: %TRUE on success, otherwise %FALSE
+ *
+ * Returns the time stamp from @event, if there is one; otherwise
+ * returns #GDK_CURRENT_TIME.
+ *
+ * Returns: time stamp field from @event
**/
-gboolean
-gdk_event_get_touchpad_angle_delta (GdkEvent *event,
- double *delta)
+guint32
+gdk_event_get_time (GdkEvent *event)
{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_TOUCHPAD_PINCH)
+ switch (event->any.type)
{
- *delta = event->touchpad_pinch.angle_delta;
- return TRUE;
+ case GDK_MOTION_NOTIFY:
+ return event->motion.time;
+ case GDK_BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ return event->button.time;
+ case GDK_TOUCH_BEGIN:
+ case GDK_TOUCH_UPDATE:
+ case GDK_TOUCH_END:
+ case GDK_TOUCH_CANCEL:
+ return event->touch.time;
+ case GDK_TOUCHPAD_SWIPE:
+ return event->touchpad_swipe.time;
+ case GDK_TOUCHPAD_PINCH:
+ return event->touchpad_pinch.time;
+ case GDK_SCROLL:
+ return event->scroll.time;
+ case GDK_KEY_PRESS:
+ case GDK_KEY_RELEASE:
+ return event->key.time;
+ case GDK_ENTER_NOTIFY:
+ case GDK_LEAVE_NOTIFY:
+ return event->crossing.time;
+ case GDK_PROXIMITY_IN:
+ case GDK_PROXIMITY_OUT:
+ return event->proximity.time;
+ case GDK_DRAG_ENTER:
+ case GDK_DRAG_LEAVE:
+ case GDK_DRAG_MOTION:
+ case GDK_DROP_START:
+ return event->dnd.time;
+ case GDK_PAD_BUTTON_PRESS:
+ case GDK_PAD_BUTTON_RELEASE:
+ return event->pad_button.time;
+ case GDK_PAD_RING:
+ case GDK_PAD_STRIP:
+ return event->pad_axis.time;
+ case GDK_PAD_GROUP_MODE:
+ return event->pad_group_mode.time;
+ case GDK_CONFIGURE:
+ case GDK_FOCUS_CHANGE:
+ case GDK_DELETE:
+ case GDK_GRAB_BROKEN:
+ case GDK_EVENT_LAST:
+ default:
+ /* return current time */
+ break;
}
-
- return FALSE;
+
+ return GDK_CURRENT_TIME;
}
/**
- * gdk_event_get_touchpad_scale:
+ * gdk_event_get_display:
* @event: a #GdkEvent
- * @scale: (out): Return location for scale
*
- * Extracts the scale from a touchpad event.
+ * Retrieves the #GdkDisplay associated to the @event.
*
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_touchpad_scale (GdkEvent *event,
- double *scale)
+ * Returns: (transfer none) (nullable): a #GdkDisplay
+ */
+GdkDisplay *
+gdk_event_get_display (GdkEvent *event)
{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_TOUCHPAD_PINCH)
- {
- *scale = event->touchpad_pinch.scale;
- return TRUE;
- }
+ if (event->any.surface)
+ return gdk_surface_get_display (event->any.surface);
- return FALSE;
+ return NULL;
}
/**
- * gdk_event_get_touch_emulating_pointer:
+ * gdk_event_get_event_sequence:
* @event: a #GdkEvent
- * @emulating: (out): Return location for information
*
- * Extracts whether a touch event is emulating a pointer event.
+ * If @event is a touch event, returns the #GdkEventSequence
+ * to which the event belongs. Otherwise, return %NULL.
*
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_touch_emulating_pointer (GdkEvent *event,
- gboolean *emulating)
+ * Returns: (transfer none): the event sequence that the event belongs to
+ */
+GdkEventSequence *
+gdk_event_get_event_sequence (GdkEvent *event)
{
- if (!event)
- return FALSE;
-
if (event->any.type == GDK_TOUCH_BEGIN ||
event->any.type == GDK_TOUCH_UPDATE ||
- event->any.type == GDK_TOUCH_END)
- {
- *emulating = event->touch.emulating_pointer;
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * gdk_event_get_grab_surface:
- * @event: a #GdkEvent
- * @surface: (out) (transfer none): Return location for the grab surface
- *
- * Extracts the grab surface from a grab broken event.
- *
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_grab_surface (GdkEvent *event,
- GdkSurface **surface)
-{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_GRAB_BROKEN)
- {
- *surface = event->grab_broken.grab_surface;
- return TRUE;
- }
+ event->any.type == GDK_TOUCH_END ||
+ event->any.type == GDK_TOUCH_CANCEL)
+ return event->touch.sequence;
- return FALSE;
+ return NULL;
}
/**
- * gdk_event_get_focus_in:
+ * gdk_event_get_modifier_state:
* @event: a #GdkEvent
- * @focus_in: (out): return location for focus direction
*
- * Extracts whether this is a focus-in or focus-out event.
+ * Returns the modifier state field of an event.
*
- * Returns: %TRUE on success, otherwise %FALSE
+ * Returns: the modifier state of @event
**/
-gboolean
-gdk_event_get_focus_in (GdkEvent *event,
- gboolean *focus_in)
-{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_FOCUS_CHANGE)
+GdkModifierType
+gdk_event_get_modifier_state (GdkEvent *event)
+{
+#if 0
+ g_return_val_if_fail (event->any.type == GDK_ENTER_NOTIFY ||
+ event->any.type == GDK_LEAVE_NOTIFY ||
+ event->any.type == GDK_BUTTON_PRESS ||
+ event->any.type == GDK_BUTTON_RELEASE ||
+ event->any.type == GDK_MOTION_NOTIFY ||
+ event->any.type == GDK_TOUCH_BEGIN ||
+ event->any.type == GDK_TOUCH_UPDATE ||
+ event->any.type == GDK_TOUCH_END ||
+ event->any.type == GDK_TOUCH_CANCEL ||
+ event->any.type == GDK_TOUCHPAD_SWIPE ||
+ event->any.type == GDK_TOUCHPAD_PINCH||
+ event->any.type == GDK_SCROLL ||
+ event->any.type == GDK_KEY_PRESS ||
+ event->any.type == GDK_KEY_RELEASE, 0);
+#endif
+
+ switch ((int)event->any.type)
{
- *focus_in = event->focus_change.in;
- return TRUE;
+ case GDK_ENTER_NOTIFY:
+ case GDK_LEAVE_NOTIFY:
+ return event->crossing.state;
+ case GDK_BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ return event->button.state;
+ case GDK_MOTION_NOTIFY:
+ return event->motion.state;
+ case GDK_TOUCH_BEGIN:
+ case GDK_TOUCH_UPDATE:
+ case GDK_TOUCH_END:
+ case GDK_TOUCH_CANCEL:
+ return event->touch.state;
+ case GDK_TOUCHPAD_SWIPE:
+ return event->touchpad_swipe.state;
+ case GDK_TOUCHPAD_PINCH:
+ return event->touchpad_pinch.state;
+ case GDK_SCROLL:
+ return event->scroll.state;
+ case GDK_KEY_PRESS:
+ case GDK_KEY_RELEASE:
+ return event->key.state;
+ default:
+ /* no state field */
+ break;
}
- return FALSE;
+ return 0;
}
/**
- * gdk_event_get_pad_group_mode:
+ * gdk_event_get_position:
* @event: a #GdkEvent
- * @group: (out): return location for the group
- * @mode: (out): return location for the mode
- *
- * Extracts group and mode information from a pad event.
+ * @x: (out): location to put event surface x coordinate
+ * @y: (out): location to put event surface y coordinate
*
- * Returns: %TRUE on success, otherwise %FALSE
+ * Extract the event surface relative x/y coordinates from an event.
**/
gboolean
-gdk_event_get_pad_group_mode (GdkEvent *event,
- guint *group,
- guint *mode)
-{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_PAD_GROUP_MODE)
- {
- *group = event->pad_group_mode.group;
- *mode = event->pad_group_mode.mode;
- return TRUE;
- }
- else if (event->any.type == GDK_PAD_BUTTON_PRESS ||
- event->any.type == GDK_PAD_BUTTON_RELEASE)
- {
- *group = event->pad_button.group;
- *mode = event->pad_button.mode;
- return TRUE;
- }
- else if (event->any.type == GDK_PAD_RING ||
- event->any.type == GDK_PAD_STRIP)
+gdk_event_get_position (GdkEvent *event,
+ double *x,
+ double *y)
+{
+#if 0
+ g_return_if_fail (event->any.type == GDK_ENTER_NOTIFY ||
+ event->any.type == GDK_LEAVE_NOTIFY ||
+ event->any.type == GDK_BUTTON_PRESS ||
+ event->any.type == GDK_BUTTON_RELEASE ||
+ event->any.type == GDK_MOTION_NOTIFY ||
+ event->any.type == GDK_TOUCH_BEGIN ||
+ event->any.type == GDK_TOUCH_UPDATE ||
+ event->any.type == GDK_TOUCH_END ||
+ event->any.type == GDK_TOUCH_CANCEL ||
+ event->any.type == GDK_TOUCHPAD_SWIPE ||
+ event->any.type == GDK_TOUCHPAD_PINCH||
+ event->any.type == GDK_DRAG_ENTER ||
+ event->any.type == GDK_DRAG_LEAVE ||
+ event->any.type == GDK_DRAG_MOTION ||
+ event->any.type == GDK_DROP_START);
+#endif
+
+ switch ((int)event->any.type)
{
- *group = event->pad_axis.group;
- *mode = event->pad_axis.mode;
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * gdk_event_get_pad_button:
- * @event: a #GdkEvent
- * @button: (out): Return location for the button
- *
- * Extracts information about the pressed button from
- * a pad event.
- *
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_pad_button (GdkEvent *event,
- guint *button)
-{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_PAD_BUTTON_PRESS ||
- event->any.type == GDK_PAD_BUTTON_RELEASE)
- {
- *button = event->pad_button.button;
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * gdk_event_get_pad_axis_value:
- * @event: a #GdkEvent
- * @index: (out): Return location for the axis index
- * @value: (out): Return location for the axis value
- *
- * Extracts the information from a pad event.
- *
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_pad_axis_value (GdkEvent *event,
- guint *index,
- gdouble *value)
-{
- if (!event)
- return FALSE;
-
- if (event->any.type == GDK_PAD_RING ||
- event->any.type == GDK_PAD_STRIP)
- {
- *index = event->pad_axis.index;
- *value = event->pad_axis.value;
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * gdk_event_get_axes:
- * @event: a #GdkEvent
- * @axes: (transfer none) (out) (array length=n_axes): the array of values for all axes
- * @n_axes: (out): the length of array
- *
- * Extracts all axis values from an event.
- *
- * Returns: %TRUE on success, otherwise %FALSE
- **/
-gboolean
-gdk_event_get_axes (GdkEvent *event,
- gdouble **axes,
- guint *n_axes)
-{
- GdkDevice *source_device;
-
- if (!event)
- return FALSE;
-
- source_device = gdk_event_get_source_device (event);
-
- if (!source_device)
- return FALSE;
-
- if (event->any.type == GDK_MOTION_NOTIFY)
- {
- *axes = event->motion.axes;
- *n_axes = gdk_device_get_n_axes (source_device);
- return TRUE;
- }
- else if (event->any.type == GDK_BUTTON_PRESS ||
- event->any.type == GDK_BUTTON_RELEASE)
- {
- *axes = event->button.axes;
- *n_axes = gdk_device_get_n_axes (source_device);
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * gdk_event_get_motion_history:
- * @event: a #GdkEvent of type %GDK_MOTION_NOTIFY
- *
- * Retrieves the history of the @event motion, as a list of time and
- * coordinates.
- *
- * Returns: (transfer container) (element-type GdkTimeCoord) (nullable): a list
- * of time and coordinates
- */
-GList *
-gdk_event_get_motion_history (GdkEvent *event)
-{
- if (event->any.type != GDK_MOTION_NOTIFY)
- return NULL;
- return g_list_reverse (g_list_copy (event->motion.history));
-}
-
-GdkEvent *
-gdk_event_button_new (GdkEventType type,
- GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- GdkDeviceTool *tool,
- guint32 time,
- GdkModifierType state,
- guint button,
- double x,
- double y,
- double *axes)
-{
- GdkEventButton *event;
-
- g_return_val_if_fail (type == GDK_BUTTON_PRESS ||
- type == GDK_BUTTON_RELEASE, NULL);
-
- event = g_new0 (GdkEventButton, 1);
- event->any.ref_count = 1;
- event->any.type = type;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->tool = tool ? g_object_ref (tool) : NULL;
- event->time = time;
- event->axes = NULL;
- event->state = state;
- event->button = button;
- event->x = x;
- event->y = y;
- event->axes = axes;
-
- return (GdkEvent *)event;
-}
-
-GdkEvent *
-gdk_event_motion_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- GdkDeviceTool *tool,
- guint32 time,
- GdkModifierType state,
- double x,
- double y,
- double *axes)
-{
- GdkEventMotion *event = g_new0 (GdkEventMotion, 1);
-
- event->any.ref_count = 1;
- event->any.type = GDK_MOTION_NOTIFY;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->tool = tool ? g_object_ref (tool) : NULL;
- event->time = time;
- event->state = state;
- event->x = x;
- event->y = y;
- event->axes = axes;
- event->state = state;
-
- return (GdkEvent *)event;
-}
-
-GdkEvent *
-gdk_event_crossing_new (GdkEventType type,
- GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- guint32 time,
- GdkModifierType state,
- double x,
- double y,
- GdkCrossingMode mode,
- GdkNotifyType detail)
-{
- GdkEventCrossing *event;
-
- g_return_val_if_fail (type == GDK_ENTER_NOTIFY ||
- type == GDK_LEAVE_NOTIFY, NULL);
-
- event = g_new0 (GdkEventCrossing, 1);
-
- event->any.ref_count = 1;
- event->any.type = type;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->time = time;
- event->state = state;
- event->x = x;
- event->y = y;
- event->mode = mode;
- event->detail = detail;
-
- return (GdkEvent *)event;
-}
-
-GdkEvent *
-gdk_event_proximity_new (GdkEventType type,
- GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- GdkDeviceTool *tool,
- guint32 time)
-{
- GdkEventProximity *event;
-
- g_return_val_if_fail (type == GDK_PROXIMITY_IN ||
- type == GDK_PROXIMITY_OUT, NULL);
-
- event = g_new0 (GdkEventProximity, 1);
-
- event->any.ref_count = 1;
- event->any.type = type;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->tool = tool ? g_object_ref (tool) : NULL;
- event->time = time;
-
- return (GdkEvent *)event;
-}
-
-GdkEvent *
-gdk_event_key_new (GdkEventType type,
- GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- guint32 time,
- GdkModifierType state,
- guint keyval,
- guint16 keycode,
- guint16 scancode,
- guint8 group,
- gboolean is_modifier)
-{
- GdkEventKey *event;
+ case GDK_ENTER_NOTIFY:
+ case GDK_LEAVE_NOTIFY:
+ *x = event->crossing.x;
+ *y = event->crossing.y;
+ break;
+ case GDK_BUTTON_PRESS:
+ case GDK_BUTTON_RELEASE:
+ *x = event->button.x;
+ *y = event->button.y;
+ break;
+ case GDK_MOTION_NOTIFY:
+ *x = event->motion.x;
+ *y = event->motion.y;
+ break;
+ case GDK_TOUCH_BEGIN:
+ case GDK_TOUCH_UPDATE:
+ case GDK_TOUCH_END:
+ case GDK_TOUCH_CANCEL:
+ *x = event->touch.x;
+ *y = event->touch.y;
+ break;
+ case GDK_TOUCHPAD_SWIPE:
+ *x = event->touchpad_swipe.x;
+ *y = event->touchpad_swipe.y;
+ break;
+ case GDK_TOUCHPAD_PINCH:
+ *x = event->touchpad_pinch.x;
+ *y = event->touchpad_pinch.y;
+ break;
+ case GDK_DRAG_ENTER:
+ case GDK_DRAG_LEAVE:
+ case GDK_DRAG_MOTION:
+ case GDK_DROP_START:
+ *x = event->dnd.x;
+ *y = event->dnd.y;
+ break;
+ default:
+ /* no position */
+ *x = NAN;
+ *y = NAN;
+ return FALSE;
+ }
- g_return_val_if_fail (type == GDK_KEY_PRESS ||
- type == GDK_KEY_RELEASE, NULL);
+ return TRUE;
+}
- event = g_new0 (GdkEventKey, 1);
+/**
+ * gdk_button_event_get_button:
+ * @event: a button event
+ *
+ * Extract the button number from a button event.
+ *
+ * Returns: the button of @event
+ **/
+guint
+gdk_button_event_get_button (GdkEvent *event)
+{
+ g_return_val_if_fail (event->any.type == GDK_BUTTON_PRESS ||
+ event->any.type == GDK_BUTTON_RELEASE, 0);
- event->any.ref_count = 1;
- event->any.type = type;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->time = time;
- event->state = state;
- event->keyval = keyval;
- event->hardware_keycode = keycode;
- event->key_scancode = scancode;
- event->group = group;
- event->is_modifier = is_modifier;
-
- return (GdkEvent *)event;
+ return event->button.button;
}
-GdkEvent *
-gdk_event_configure_new (GdkSurface *surface,
- int width,
- int height)
+/**
+ * gdk_key_event_get_keyval:
+ * @event: a key event
+ *
+ * Extracts the keyval from a key event.
+ *
+ * Returns: the keyval of @event
+ */
+guint
+gdk_key_event_get_keyval (GdkEvent *event)
{
- GdkEventConfigure *event = g_new0 (GdkEventConfigure, 1);
-
- event->any.ref_count = 1;
- event->any.type = GDK_CONFIGURE;
- event->any.surface = g_object_ref (surface);
- event->width = width;
- event->height = height;
+ g_return_val_if_fail (event->any.type == GDK_KEY_PRESS ||
+ event->any.type == GDK_KEY_RELEASE, 0);
- return (GdkEvent *)event;
+ return event->key.keyval;
}
-GdkEvent *
-gdk_event_delete_new (GdkSurface *surface)
+/**
+ * gdk_key_event_get_keycode:
+ * @event: a key event
+ *
+ * Extracts the keycode from a key event.
+ *
+ * Returns: the keycode of @event
+ */
+guint
+gdk_key_event_get_keycode (GdkEvent *event)
{
- GdkEventAny *event = g_new0 (GdkEventAny, 1);
-
- event->ref_count = 1;
- event->type = GDK_DELETE;
- event->surface = g_object_ref (surface);
+ g_return_val_if_fail (event->any.type == GDK_KEY_PRESS ||
+ event->any.type == GDK_KEY_RELEASE, 0);
- return (GdkEvent *)event;
+ return event->key.hardware_keycode;
}
-GdkEvent *
-gdk_event_focus_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- gboolean focus_in)
+/**
+ * gdk_key_event_get_scancode:
+ * @event: a key event
+ *
+ * Extracts the scancode from a key event.
+ *
+ * Returns: the scancode of @event
+ */
+guint
+gdk_key_event_get_scancode (GdkEvent *event)
{
- GdkEventFocus *event = g_new0 (GdkEventFocus, 1);
-
- event->any.ref_count = 1;
- event->any.type = GDK_FOCUS_CHANGE;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->in = focus_in;
+ g_return_val_if_fail (event->any.type == GDK_KEY_PRESS ||
+ event->any.type == GDK_KEY_RELEASE, 0);
- return (GdkEvent *)event;
+ return event->key.key_scancode;
}
-GdkEvent *
-gdk_event_scroll_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- GdkDeviceTool *tool,
- guint32 time,
- GdkModifierType state,
- double delta_x,
- double delta_y,
- gboolean is_stop)
+/**
+ * gdk_key_event_get_group:
+ * @event: a key event
+ *
+ * Extracts the group from a key event.
+ *
+ * Returns: the group of @event
+ */
+guint
+gdk_key_event_get_group (GdkEvent *event)
{
- GdkEventScroll *event = g_new0 (GdkEventScroll, 1);
-
- event->any.ref_count = 1;
- event->any.type = GDK_SCROLL;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->tool = tool ? g_object_ref (tool) : NULL;
- event->time = time;
- event->state = state;
- event->x = NAN;
- event->y = NAN;
- event->direction = GDK_SCROLL_SMOOTH;
- event->delta_x = delta_x;
- event->delta_y = delta_y;
- event->is_stop = is_stop;
+ g_return_val_if_fail (event->any.type == GDK_KEY_PRESS ||
+ event->any.type == GDK_KEY_RELEASE, 0);
- return (GdkEvent *)event;
+ return event->key.group;
}
-GdkEvent *
-gdk_event_discrete_scroll_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- GdkDeviceTool *tool,
- guint32 time,
- GdkModifierType state,
- GdkScrollDirection direction,
- gboolean emulated)
+/**
+ * gdk_key_event_is_modifier:
+ * @event: a key event
+ *
+ * Extracts whether the key event is for a modifier key.
+ *
+ * Returns: %TRUE if the @event is for a modifier key
+ */
+gboolean
+gdk_key_event_is_modifier (GdkEvent *event)
{
- GdkEventScroll *event = g_new0 (GdkEventScroll, 1);
-
- event->any.ref_count = 1;
- event->any.type = GDK_SCROLL;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->tool = tool ? g_object_ref (tool) : NULL;
- event->time = time;
- event->state = state;
- event->x = NAN;
- event->y = NAN;
- event->direction = direction;
- if (emulated)
- event->any.flags = GDK_EVENT_POINTER_EMULATED;
+ g_return_val_if_fail (event->any.type == GDK_KEY_PRESS ||
+ event->any.type == GDK_KEY_RELEASE, FALSE);
- return (GdkEvent *)event;
+ return event->key.is_modifier;
}
-GdkEvent *
-gdk_event_touch_new (GdkEventType type,
- GdkEventSequence *sequence,
- GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- guint32 time,
- GdkModifierType state,
- double x,
- double y,
- double *axes,
- gboolean emulating)
+/**
+ * gdk_configure_event_get_size:
+ * @event: a configure event
+ * @width: (out): return location for surface width
+ * @height: (out): return location for surface height
+ *
+ * Extracts the surface size from a configure event.
+ */
+void
+gdk_configure_event_get_size (GdkEvent *event,
+ int *width,
+ int *height)
{
- GdkEventTouch *event;
-
- g_return_val_if_fail (type == GDK_TOUCH_BEGIN ||
- type == GDK_TOUCH_END ||
- type == GDK_TOUCH_UPDATE ||
- type == GDK_TOUCH_CANCEL, NULL);
+ g_return_if_fail (event->any.type == GDK_CONFIGURE);
- event = g_new0 (GdkEventTouch, 1);
+ *width = event->configure.width;
+ *height = event->configure.height;
+}
- event->any.ref_count = 1;
- event->any.type = type;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->sequence = sequence;
- event->time = time;
- event->state = state;
- event->x = x;
- event->y = y;
- event->axes = axes;
- event->emulating_pointer = emulating;
- if (emulating)
- event->any.flags = GDK_EVENT_POINTER_EMULATED;
+/**
+ * gdk_touch_event_get_emulating_pointer:
+ * @event: a touch event
+ *
+ * Extracts whether a touch event is emulating a pointer event.
+ *
+ * Returns: %TRUE if @event is emulating
+ **/
+gboolean
+gdk_touch_event_get_emulating_pointer (GdkEvent *event)
+{
+ g_return_val_if_fail (event->any.type == GDK_TOUCH_BEGIN ||
+ event->any.type == GDK_TOUCH_UPDATE ||
+ event->any.type == GDK_TOUCH_END ||
+ event->any.type == GDK_TOUCH_CANCEL, FALSE);
- return (GdkEvent *)event;
+ return event->touch.emulating_pointer;
}
-GdkEvent *
-gdk_event_touchpad_swipe_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- guint32 time,
- GdkModifierType state,
- GdkTouchpadGesturePhase phase,
- double x,
- double y,
- int n_fingers,
- double dx,
- double dy)
+/**
+ * gdk_crossing_event_get_mode:
+ * @event: a crossing event
+ *
+ * Extracts the crossing mode from a crossing event.
+ *
+ * Returns: the mode of @event
+ */
+GdkCrossingMode
+gdk_crossing_event_get_mode (GdkEvent *event)
{
- GdkEventTouchpadSwipe *event = g_new0 (GdkEventTouchpadSwipe, 1);
+ g_return_val_if_fail (event->any.type == GDK_ENTER_NOTIFY ||
+ event->any.type == GDK_LEAVE_NOTIFY, 0);
- event->any.ref_count = 1;
- event->any.type = GDK_TOUCHPAD_SWIPE;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->time = time;
- event->state = state;
- event->phase = phase;
- event->x = x;
- event->y = y;
- event->dx = dx;
- event->dy = dy;
- event->n_fingers = n_fingers;
+ return event->crossing.mode;
+}
- return (GdkEvent *)event;
+/**
+ * gdk_crossing_event_get_detail:
+ * @event: a crossing event
+ *
+ * Extracts the notify detail from a crossing event.
+ *
+ * Returns: the notify detail of @event
+ */
+GdkNotifyType
+gdk_crossing_event_get_detail (GdkEvent *event)
+{
+ g_return_val_if_fail (event->any.type == GDK_ENTER_NOTIFY ||
+ event->any.type == GDK_LEAVE_NOTIFY, 0);
+
+ return event->crossing.detail;
}
-GdkEvent *
-gdk_event_touchpad_pinch_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- guint32 time,
- GdkModifierType state,
- GdkTouchpadGesturePhase phase,
- double x,
- double y,
- int n_fingers,
- double dx,
- double dy,
- double scale,
- double angle_delta)
+/**
+ * gdk_focus_event_get_in:
+ * @event: a focus change event
+ *
+ * Extracts whether this event is about focus entering or
+ * leaving the surface.
+ *
+ * Returns: %TRUE of the focus is entering
+ */
+gboolean
+gdk_focus_event_get_in (GdkEvent *event)
{
- GdkEventTouchpadPinch *event = g_new0 (GdkEventTouchpadPinch, 1);
+ g_return_val_if_fail (event->any.type == GDK_FOCUS_CHANGE, FALSE);
- event->any.ref_count = 1;
- event->any.type = GDK_TOUCHPAD_PINCH;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->time = time;
- event->state = state;
- event->phase = phase;
- event->x = x;
- event->y = y;
- event->dx = dx;
- event->dy = dy;
- event->n_fingers = n_fingers;
- event->scale = scale;
- event->angle_delta = angle_delta;
+ return event->focus_change.in;
+}
- return (GdkEvent *)event;
+/**
+ * gdk_scroll_event_get_direction:
+ * @event: a scroll event
+ *
+ * Extracts the direction of a scroll event.
+ *
+ * Returns: the scroll direction of @event
+ */
+GdkScrollDirection
+gdk_scroll_event_get_direction (GdkEvent *event)
+{
+ g_return_val_if_fail (event->any.type == GDK_SCROLL, 0);
+
+ return event->scroll.direction;
}
-GdkEvent *
-gdk_event_pad_ring_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- guint32 time,
- guint group,
- guint index,
- guint mode,
- double value)
+/**
+ * gdk_scroll_event_get_deltas:
+ * @event: a scroll event
+ * @delta_x: (out): return location for x scroll delta
+ * @delta_y: (out): return location for y scroll delta
+ *
+ * Extracts the scroll deltas of a scroll event.
+ *
+ * The deltas will be zero unless the scroll direction
+ * is %GDK_SCROLL_SMOOTH.
+ */
+void
+gdk_scroll_event_get_deltas (GdkEvent *event,
+ double *delta_x,
+ double *delta_y)
{
- GdkEventPadAxis *event = g_new0 (GdkEventPadAxis, 1);
+ g_return_if_fail (event->any.type == GDK_SCROLL);
- event->any.ref_count = 1;
- event->any.type = GDK_PAD_RING;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->time = time;
- event->group = group;
- event->index = index;
- event->mode = mode;
- event->value = value;
+ *delta_x = event->scroll.delta_x;
+ *delta_y = event->scroll.delta_y;
+}
- return (GdkEvent *)event;
+/**
+ * gdk_scroll_event_is_stop:
+ * @event: a scroll event
+ *
+ * Check whether a scroll event is a stop scroll event. Scroll sequences
+ * with smooth scroll information may provide a stop scroll event once the
+ * interaction with the device finishes, e.g. by lifting a finger. This
+ * stop scroll event is the signal that a widget may trigger kinetic
+ * scrolling based on the current velocity.
+ *
+ * Stop scroll events always have a delta of 0/0.
+ *
+ * Returns: %TRUE if the event is a scroll stop event
+ */
+gboolean
+gdk_scroll_event_is_stop (GdkEvent *event)
+{
+ g_return_val_if_fail (event->any.type == GDK_SCROLL, FALSE);
+
+ return event->scroll.is_stop;
}
-GdkEvent *
-gdk_event_pad_strip_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- guint32 time,
- guint group,
- guint index,
- guint mode,
- double value)
+/**
+ * gdk_touchpad_event_get_gesture_phase:
+ * @event: a touchpad #GdkEvent
+ *
+ * Extracts the touchpad gesture phase from a touchpad event.
+ *
+ * Returns: the gesture phase of @event
+ **/
+GdkTouchpadGesturePhase
+gdk_touchpad_event_get_gesture_phase (GdkEvent *event)
{
- GdkEventPadAxis *event = g_new0 (GdkEventPadAxis, 1);
+ g_return_val_if_fail (event->any.type == GDK_TOUCHPAD_PINCH ||
+ event->any.type == GDK_TOUCHPAD_SWIPE, 0);
- event->any.ref_count = 1;
- event->any.type = GDK_PAD_STRIP;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->time = time;
- event->group = group;
- event->index = index;
- event->mode = mode;
- event->value = value;
+ if (event->any.type == GDK_TOUCHPAD_PINCH)
+ return event->touchpad_pinch.phase;
+ else if (event->any.type == GDK_TOUCHPAD_SWIPE)
+ return event->touchpad_swipe.phase;
- return (GdkEvent *)event;
+ return 0;
}
-GdkEvent *
-gdk_event_pad_button_new (GdkEventType type,
- GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- guint32 time,
- guint group,
- guint button,
- guint mode)
+/**
+ * gdk_touchpad_event_get_n_fingers:
+ * @event: a touchpad event
+ *
+ * Extracts the number of fingers from a touchpad event.
+ *
+ * Returns: the number of fingers for @event
+ **/
+guint
+gdk_touchpad_event_get_n_fingers (GdkEvent *event)
{
- GdkEventPadButton *event;
+ g_return_val_if_fail (event->any.type == GDK_TOUCHPAD_PINCH ||
+ event->any.type == GDK_TOUCHPAD_SWIPE, 0);
- g_return_val_if_fail (type == GDK_PAD_BUTTON_PRESS ||
- type == GDK_PAD_BUTTON_RELEASE, NULL);
+ if (event->any.type == GDK_TOUCHPAD_PINCH)
+ return event->touchpad_pinch.n_fingers;
+ else if (event->any.type == GDK_TOUCHPAD_SWIPE)
+ return event->touchpad_swipe.n_fingers;
- event = g_new0 (GdkEventPadButton, 1);
+ return 0;
+}
- event->any.ref_count = 1;
- event->any.type = type;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->time = time;
- event->group = group;
- event->button = button;
- event->mode = mode;
+/**
+ * gdk_touchpad_event_get_deltas:
+ * @event: a touchpad event
+ * @dx: (out): return location for x
+ * @dy: (out): return location for y
+ *
+ * Extracts delta information from a touchpad event.
+ **/
+void
+gdk_touchpad_event_get_deltas (GdkEvent *event,
+ double *dx,
+ double *dy)
+{
+ g_return_if_fail (event->any.type == GDK_TOUCHPAD_PINCH ||
+ event->any.type == GDK_TOUCHPAD_SWIPE);
- return (GdkEvent *)event;
+ if (event->any.type == GDK_TOUCHPAD_PINCH)
+ {
+ *dx = event->touchpad_pinch.dx;
+ *dy = event->touchpad_pinch.dy;
+ }
+ else if (event->any.type == GDK_TOUCHPAD_SWIPE)
+ {
+ *dx = event->touchpad_swipe.dx;
+ *dy = event->touchpad_swipe.dy;
+ }
+ else
+ {
+ *dx = NAN;
+ *dy = NAN;
+ }
}
-GdkEvent *
-gdk_event_pad_group_mode_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- guint32 time,
- guint group,
- guint mode)
+/**
+ * gdk_touchpad_pinch_event_get_angle_delta:
+ * @event: a touchpad pinch event
+ *
+ * Extracts the angle delta from a touchpad pinch event.
+ *
+ * Returns: the angle delta of @event
+ */
+double
+gdk_touchpad_pinch_event_get_angle_delta (GdkEvent *event)
{
- GdkEventPadGroupMode *event = g_new0 (GdkEventPadGroupMode, 1);
+ g_return_val_if_fail (event->any.type == GDK_TOUCHPAD_PINCH, 0);
- event->any.ref_count = 1;
- event->any.type = GDK_PAD_GROUP_MODE;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->time = time;
- event->group = group;
- event->mode = mode;
+ return event->touchpad_pinch.angle_delta;
+}
- return (GdkEvent *)event;
+/**
+ * gdk_touchpad_pinch_event_get_scale:
+ * @event: a touchpad pinch event
+ *
+ * Extracts the scale from a touchpad pinch event.
+ *
+ * Returns: the scale of @event
+ **/
+double
+gdk_touchpad_pinch_event_get_scale (GdkEvent *event)
+{
+ g_return_val_if_fail (event->any.type == GDK_TOUCHPAD_PINCH, 0);
+
+ return event->touchpad_pinch.scale;
}
-GdkEvent *
-gdk_event_drag_new (GdkEventType type,
- GdkSurface *surface,
- GdkDevice *device,
- GdkDrop *drop,
- guint32 time,
- double x,
- double y)
+/**
+ * gdk_pad_button_event_get_button:
+ * @event: a pad button event
+ *
+ * Extracts information about the pressed button from
+ * a pad event.
+ *
+ * Returns: the button of @event
+ **/
+guint
+gdk_pad_button_event_get_button (GdkEvent *event)
{
- GdkEventDND *event;
+ g_return_val_if_fail (event->any.type == GDK_PAD_BUTTON_PRESS ||
+ event->any.type == GDK_PAD_BUTTON_RELEASE, 0);
- g_return_val_if_fail (type == GDK_DRAG_ENTER ||
- type == GDK_DRAG_MOTION ||
- type == GDK_DRAG_LEAVE ||
- type == GDK_DROP_START, NULL);
+ return event->pad_button.button;
+}
- event = g_new0 (GdkEventDND, 1);
+/**
+ * gdk_pad_axis_event_get_value:
+ * @event: a pad strip or ring event
+ * @index: (out): Return location for the axis index
+ * @value: (out): Return location for the axis value
+ *
+ * Extracts the information from a pad strip or ring event.
+ **/
+void
+gdk_pad_axis_event_get_value (GdkEvent *event,
+ guint *index,
+ gdouble *value)
+{
+ g_return_if_fail (event->any.type == GDK_PAD_RING ||
+ event->any.type == GDK_PAD_STRIP);
- event->any.ref_count = 1;
- event->any.type = type;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->drop = g_object_ref (drop);
- event->time = time;
- event->x = x;
- event->y = y;
+ *index = event->pad_axis.index;
+ *value = event->pad_axis.value;
+}
- return (GdkEvent *)event;
+/**
+ * gdk_pad_event_get_group_mode:
+ * @event: a pad event
+ * @group: (out): return location for the group
+ * @mode: (out): return location for the mode
+ *
+ * Extracts group and mode information from a pad event.
+ **/
+void
+gdk_pad_event_get_group_mode (GdkEvent *event,
+ guint *group,
+ guint *mode)
+{
+ g_return_if_fail (event->any.type == GDK_PAD_GROUP_MODE ||
+ event->any.type == GDK_PAD_BUTTON_PRESS ||
+ event->any.type == GDK_PAD_BUTTON_RELEASE ||
+ event->any.type == GDK_PAD_RING ||
+ event->any.type == GDK_PAD_STRIP);
+
+ switch ((guint)event->any.type)
+ {
+ case GDK_PAD_GROUP_MODE:
+ *group = event->pad_group_mode.group;
+ *mode = event->pad_group_mode.mode;
+ break;
+ case GDK_PAD_BUTTON_PRESS:
+ case GDK_PAD_BUTTON_RELEASE:
+ *group = event->pad_button.group;
+ *mode = event->pad_button.mode;
+ break;
+ case GDK_PAD_RING:
+ case GDK_PAD_STRIP:
+ *group = event->pad_axis.group;
+ *mode = event->pad_axis.mode;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
}
-GdkEvent *
-gdk_event_grab_broken_new (GdkSurface *surface,
- GdkDevice *device,
- GdkDevice *source_device,
- GdkSurface *grab_surface,
- gboolean implicit)
+/**
+ * gdk_drag_event_get_drop:
+ * @event: a DND event
+ *
+ * Gets the #GdkDrop from a DND event.
+ *
+ * Returns: (transfer none) (nullable): the drop
+ **/
+GdkDrop *
+gdk_drag_event_get_drop (GdkEvent *event)
{
- GdkEventGrabBroken *event = g_new0 (GdkEventGrabBroken, 1);
+ g_return_val_if_fail (event->any.type == GDK_DRAG_ENTER ||
+ event->any.type == GDK_DRAG_LEAVE ||
+ event->any.type == GDK_DRAG_MOTION ||
+ event->any.type == GDK_DROP_START, NULL);
- event->any.ref_count = 1;
- event->any.type = GDK_GRAB_BROKEN;
- event->any.surface = g_object_ref (surface);
- event->any.device = g_object_ref (device);
- event->any.source_device = g_object_ref (source_device);
- event->grab_surface = grab_surface;
- event->implicit = implicit;
- event->keyboard = gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD;
+ return event->dnd.drop;
+}
- return (GdkEvent *)event;
+/**
+ * gdk_grab_broken_event_get_grab_surface:
+ * @event: a grab broken event
+ *
+ * Extracts the grab surface from a grab broken event.
+ *
+ * Returns: the grab surface of @event
+ **/
+GdkSurface *
+gdk_grab_broken_event_get_grab_surface (GdkEvent *event)
+{
+ g_return_val_if_fail (event->any.type == GDK_GRAB_BROKEN, NULL);
+
+ return event->grab_broken.grab_surface;
}